/**
 *  This class is the main class, text based adventure game.  Users 
 *  can walk around some scenery. That's all. It should really be extended 
 *  to make it more interesting!
 * 
 *  To play this adventure game, create an instance of this class and call the "play"
 *  method.
 * 
 *  This main class creates and initialises all the others: it creates all
 *  rooms, creates the parser and starts the game.  It also evaluates and
 *  executes the commands that the parser returns.
 * 
 */

public class Game {
	private Parser parser;
	private Room currentRoom, depart, hall, sortie;
	private String[] item;
	private int c = 0, pas = 0, pvJ = 10;
	private CommandWords listCommande;
	private boolean arme = false, finished = false, shield = false;
	private Ascii ascii = new Ascii();
	private boolean bonus = false;
		
	/**
	 * Create the game and initialise its internal map.
	 */
	public Game()  {
		createRooms();
		parser = new Parser();
		this.item = new String[5];
		listCommande = new CommandWords();
	}

	/**
	 * Create all the rooms and link their exits together.
	 */
	private void createRooms() {
		Room cellule1, cellule2, couloirCellule, escalierCellule, avantGarde, gardeManger, dortoir, escalierHall;
		Room rezDeChaussee, toilette, magicien, trophee, escalierEtage, etage, chambreRoi, bibliotheque;
	  
		// create the rooms
		depart = new Room("Cellule de depart du donjon", 0);
		cellule1 = new Room("2eme cellule", 1, this);
		cellule2 = new Room("3eme cellule", 2, this);
		couloirCellule = new Room("Couloir des cellules", 0);
		escalierCellule = new Room("Escalier du cachot", 0);
		avantGarde = new Room("Avant garde", 2, this);
		gardeManger = new Room("Garde manger", 2, this);
		dortoir = new Room("Dortoir des gardes", 1, this);
		escalierHall = new Room("Escalier du Hall", 0);
		hall = new Room("Hall d'entree du donjon", 3, this);
		rezDeChaussee = new Room("Couloir rez-de-chaussee", 0);
		toilette = new Room("Toilettes du donjon", 1, this);
		magicien = new Room("Salle du magicien", 4, this);
		trophee = new Room("Salle des trophees", 2);
		escalierEtage = new Room("Escalier de l'etage", 0);
		etage = new Room("Palier de l'etage", 0);
		chambreRoi = new Room("Chambre du Roi", 5, this);
		bibliotheque = new Room("Bibliotheque", 6);
		sortie = new Room("Sortie du donjon", 0);
		
		// initialise room exits
		depart.setExit("Nord", couloirCellule);
		cellule1.setExit("Nord", couloirCellule);
		cellule2.setExit("Nord", couloirCellule);
		couloirCellule.setExit("Nord", escalierCellule);
		couloirCellule.setExit("Est", cellule2);
		couloirCellule.setExit("Sud", cellule1);
		couloirCellule.setExit("Ouest", depart);
		escalierCellule.setExit("Nord", avantGarde);
		escalierCellule.setExit("Sud", couloirCellule);
		avantGarde.setExit("Nord", dortoir);
		avantGarde.setExit("Est", gardeManger);
		avantGarde.setExit("Sud", escalierCellule);
		avantGarde.setExit("Ouest", escalierHall);
		gardeManger.setExit("Ouest", avantGarde);
		dortoir.setExit("Sud", avantGarde);
		escalierHall.setExit("Est", avantGarde);
		escalierHall.setExit("Ouest", hall);
		hall.setExit("Nord", sortie);
		hall.setExit("Est", escalierHall);
		hall.setExit("Sud", rezDeChaussee);
		hall.setExit("Ouest", escalierEtage);
		rezDeChaussee.setExit("Nord", hall);
		rezDeChaussee.setExit("Est", magicien);
		rezDeChaussee.setExit("Sud", trophee);
		rezDeChaussee.setExit("Ouest", toilette);
		magicien.setExit("Ouest", rezDeChaussee);
		trophee.setExit("Nord", rezDeChaussee);
		toilette.setExit("Est", rezDeChaussee);
		escalierEtage.setExit("Est", hall);
		escalierEtage.setExit("Ouest", etage);
		etage.setExit("Nord", chambreRoi);
		etage.setExit("Est", escalierEtage);
		etage.setExit("Sud", bibliotheque);
		chambreRoi.setExit("Sud", etage);
		bibliotheque.setExit("Nord", etage);

		currentRoom = depart;  // start game outside
	}

	/**
	 *  Main play routine.  Loops until end of play.
	 */
	public void play() {
		printWelcome();
		// Enter the main command loop.  Here we repeatedly read commands and
		// execute them until the game is over.
		while (! finished) {
			Command command = parser.getCommand();
			finished = processCommand(command);
		}
		this.exit();
	}

	/**
	 * Print out the opening message for the player.
	 */
	private void printWelcome() {
		try {
			Runtime.getRuntime().exec("cls");
		}
		catch (Exception e) {
			
		}
		System.out.println("\nBienvenu dans le donjon de l'OMGL !");
		System.out.println("Vous allez vivre une aventure incroyable au travers de ce jeu!");
		System.out.println("En cas de besoin, vous pouvez taper help pour avoir l'aide.\n");
		System.out.println("Votre objectif est de trouver la cle afin d'ouvrir la porte de sortie.");
		System.out.println("Pour vous deplacez, taper 'go ' puis la destination choisie avec la premiere lettre en majuscule.");
		System.out.println("Vous pouvez egalement avoir vos informations en tapant la commande : status.");
		System.out.println("Et si vous vous sentez l'ame d'un preux chevalier, vous pouvez egalement explorer chaque piece.\n");
		System.out.println(this.currentRoom.getLongDescription());
	}

	/**
	 * Given a command, process (that is: execute) the command.
	 * @param command The command to be processed.
	 * @return true If the command ends the game, false otherwise.
	 */
	private boolean processCommand(Command command) {
		boolean wantToQuit = false;
		String temp = null;
		boolean enigme;
		if(command.isUnknown()) {
			System.out.println("Je ne vous ai pas compris...");
			return false;
		}

		String commandWord = command.getCommandWord();
		if (commandWord.equals("help"))
			printHelp();
		else if (commandWord.equals("go"))
			goRoom(command);
		else if (commandWord.equals("explore")) {
			temp = currentRoom.explore(this.item);
			if (temp != null) {
				this.item[c] = temp;
				c++;
			}
		}
		else if (commandWord.equals("status"))
			printStatus();
		else if ((commandWord.equals("bas")&&(currentRoom == hall)&&(!(this.bonus))))
			if (this.hall.enigme()) {
				this.pieceBonus();
			}
		else if ((commandWord.equals("quit"))||(commandWord.equals("exit")))
			wantToQuit = quit(command);
		else
			System.out.println("Je ne vous ai pas compris...");
		return wantToQuit;
	}

	// implementations of user commands:

	/** 
	 * Try to go to one direction. If there is an exit, enter
	 * the new room, otherwise print an error message.
	 */
	private void goRoom(Command command)  {
		if(!command.hasSecondWord()) {
			// if there is no second word, we don't know where to go...
			System.out.println("Sans direction, je fais comment...");
			return;
		}

		String direction = command.getSecondWord();

		// Try to leave current room.
		Room nextRoom = null;
		if((direction.equals("Nord"))&&(currentRoom != hall)) {
			nextRoom = currentRoom.getExit("Nord");
		}
		if(direction.equals("Est")) {
			nextRoom = currentRoom.getExit("Est");
		}
		if(direction.equals("Sud")) {
			nextRoom = currentRoom.getExit("Sud");
		}
		if(direction.equals("Ouest")) {
			nextRoom = currentRoom.getExit("Ouest");
		}
		if ((direction.equals("Nord"))&&(currentRoom == hall)) {
			boolean cle = false;
			for (int i=0; i<item.length; i++) {
				if (item[i] == "cle")
					cle = true;
			}
			if (cle == false) {
				System.out.println("Vous n'avez pas la cle pour ouvrir cette porte.");
				currentRoom = hall;
			}
			else {
				if (currentRoom.combat("Dragon", 15) == true) {
					System.out.println("Bravo, vous avez termine le jeu.");
					this.exit();
				}
			}
			this.printLocationInfo();
			return;
		}
		if (nextRoom == null) {
			System.out.println("Il n'y a rien dans cette direction");
		}
		else {
			currentRoom = nextRoom;
			this.printLocationInfo();
			pas++;
		}
	}

	/**
	 * Print out some help information.
	 * Here we print some stupid, cryptic message and a list of the 
	 * command words.
	 */
	private void printHelp() {
		System.out.println("Vous etes perdu. Votre objectif : trouve une cle pour ouvrir la porte de sortie.");
		System.out.println("Vous devrez explorer ce donjon de fond en comble afin d'en percer ces mysteres et decouvrir les secrets qu'il renferme.");
		System.out.println();
		System.out.println("Les commandes disponibles sont :");
		System.out.println(listCommande.getCommandList());
	}

	/**
	 * Affiche les items.
	 * Affiche la liste de tout les items que le joueur possede.
	 */
	public void printStatus() {
		System.out.println("Vous point de vies sont actuellement de : " + this.getPV());
		if (c !=0) {
			System.out.println("Vous avez actuellement dans votre inventaire : ");
			for (int i = 0; i<this.item.length; i++) {
				if (this.item[i] != null) {
					System.out.println(this.item[i]);
				}
			}
		}
		else
			System.out.println("Votre inventaire est vide. Vous devriez essayer d'explorer le donjon...");
	}
	
	/**
	 * Affiche la localisation actuelle du joueur.
	 */
	public void printLocationInfo() {
		System.out.println("Votre position actuelle est : " + currentRoom.getLongDescription());
		currentRoom.getExitString();
	}

	public void reset() {
		currentRoom = depart;
		this.printLocationInfo();
	}

	/** 
	 * "Quit" was entered. Check the rest of the command to see
	 * whether we really quit the game.
	 * @return true, if this command quits the game, false otherwise.
	 */
	private boolean quit(Command command)   {
		if(command.hasSecondWord()) {
			System.out.println("Quit what?");
			return false;
		}
		else {
			return true;  // signal that we want to quit
		}
	}

	public void setArme(boolean a) {
		this.arme = a;
	}

	public boolean getArme() {
		return this.arme;
	}

	public void setPV(int a) {
		this.pvJ = a;
	}

	public int getPV() {
		return this.pvJ;
	}

	public boolean getShield() {
		return this.shield;
	}

	public void pieceBonus() {
		System.out.println("\nLa fee, enechange de tes bonnes reponses, t'offre un nouvel objet :");
		this.ascii.shield();
		System.out.println("\nIl te permettra sans doutes de te proteger des tes adversaires et de parer leurs attaques.");
		this.shield = true;
		this.bonus = true;
		this.item[c] = "Bouclier";
		c++;
	}

	public void exit () {
		System.out.println("\nVous avez trouve " + this.c + " objets sur les 5 objets possibles.");
		System.out.println("Vous avez fait " + pas + " deplacements.");
		System.out.println("Merci d'avoir joue a notre jeu!\n");
		System.exit(0);
	}
//-------------------------------------------------------------------------------------------------
	public static void main(String[] args) {
			Game jeu = new Game();
			jeu.play();
	}
//-------------------------------------------------------------------------------------------------			
}